/**
 * Generali Solutions d'assurances - Tous droits rï¿½servï¿½s &copy; 2007 - 2010
 */
package fr.generali.accueilclient.referentiel.services.impl;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.produit.param.ITableProduit;
import fr.generali.accueilclient.referentiel.ReferentielEnum;
import fr.generali.accueilclient.referentiel.assembler.ListParamClient2MapConverter;
import fr.generali.accueilclient.referentiel.assembler.ListProduits2MapTableProduitConverter;
import fr.generali.accueilclient.referentiel.assembler.ListProduits2MapTableProduitSanteConverter;
import fr.generali.accueilclient.referentiel.assembler.ListValeursContextTranso2MapConverter;
import fr.generali.accueilclient.table.param.ITableParam;
import fr.generali.accueilclient.utils.tuple.Couple;
import fr.generali.refservcommuns.rce.demat.referentiel.client.list.param.DossierParamClient;
import fr.generali.refservcommuns.rce.demat.referentiel.client.list.param.ListParamClient;
import fr.generali.refservcommuns.rce.referentiel.produits.list.produit.DTOProduit;
import fr.generali.refservcommuns.rce.referentiel.produits.list.produit.DossierProduit;
import fr.generali.refservcommuns.rce.referentiel.valeurs.list.transco.DossierTransco;
import fr.generali.refservcommuns.rce.referentiel.valeurs.list.transco.ListValeursContextTranso;

/**
 * @author ebrouillard Classe de mapper utilisï¿½e par ReferentielService
 */
@Component("referentielServiceMapper")
public class ReferentielServiceMapper {

    /**
    *
    */
    @Value("${ws.ref.produit.libelle.type.maladie}")
    private String libelleProduitTypeSante;

    /**
     * Transforme un {@link DossierParamClient} en une map
     * 
     * @param dossier la rï¿½ponse du service rï¿½fï¿½rentiel client
     * @return le rï¿½fï¿½rentiel tel qu'on le stocke dans l'appli
     */
    public Map<ReferentielEnum, Map<String, String>> mapperReferentielClient(DossierParamClient dossier) {
        Map<ReferentielEnum, Map<String, String>> map = new HashMap<ReferentielEnum, Map<String, String>>();

        if (dossier != null && CollectionUtils.isNotEmpty(dossier.getListParamClient())) {

            Converter<ListParamClient, Couple<ReferentielEnum, Map<String, String>>> listParamClient2MapConverter =
                            new ListParamClient2MapConverter();

            for (Iterator<ListParamClient> iterator = dossier.getListParamClient().iterator(); iterator.hasNext();) {
                Couple<ReferentielEnum, Map<String, String>> couple =
                                listParamClient2MapConverter.convert(iterator.next());
                if (couple != null) {
                    map.put(couple.getOne(), couple.getTwo());
                }
            }
        }

        return map;
    }

    /**
     * Transforme un {@link DossierParamClient} en une map
     * 
     * @param dossier la rï¿½ponse du service rï¿½fï¿½rentiel contrat
     * @return le rï¿½fï¿½rentiel tel qu'on le stocke dans l'appli
     */
    public Map<ReferentielEnum, Map<String, String>> mapperReferentielContrat(DossierTransco dossier) {
        Map<ReferentielEnum, Map<String, String>> map = new HashMap<ReferentielEnum, Map<String, String>>();

        if (dossier != null && CollectionUtils.isNotEmpty(dossier.getListValeursContextTranso())) {

            Converter<ListValeursContextTranso, Couple<ReferentielEnum, Map<String, String>>> listValeursContextTranso2MapConverter =
                            new ListValeursContextTranso2MapConverter();

            for (Iterator<ListValeursContextTranso> iterator = dossier.getListValeursContextTranso().iterator(); iterator
                            .hasNext();) {
                Couple<ReferentielEnum, Map<String, String>> couple =
                                listValeursContextTranso2MapConverter.convert(iterator.next());
                if (couple != null) {
                    map.put(couple.getOne(), couple.getTwo());
                }
            }
        }

        return map;
    }

    /**
     * Transforme un {@link DossierProduit} en une map
     * 
     * @param dossier la rï¿½ponse du service rï¿½fï¿½rentiel produit
     * @return le rï¿½fï¿½rentiel tel qu'on le stocke dans l'appli
     */
    public Map<ReferentielEnum, Map<ITableParam, ITableProduit>> mapperReferentielProduit(DossierProduit dossier) {
        Map<ReferentielEnum, Map<ITableParam, ITableProduit>> map =
                        new HashMap<ReferentielEnum, Map<ITableParam, ITableProduit>>();

        if (dossier != null && CollectionUtils.isNotEmpty(dossier.getDTOProduit())) {

            Converter<List<DTOProduit>, Couple<ReferentielEnum, Map<ITableParam, ITableProduit>>> listProduits2MapTableProduitConverter =
                            new ListProduits2MapTableProduitConverter();

            Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> couple =
                            listProduits2MapTableProduitConverter.convert(dossier.getDTOProduit());
            if (couple != null) {
                map.put(couple.getOne(), couple.getTwo());
            }
        }

        return map;
    }

    /**
     * Transforme un {@link DossierProduit} en une map
     * 
     * @param dossier la reponse du service referentiel produit type sante
     * @return le referentiel tel qu'on le stocke dans l'appli
     */
    public Map<ReferentielEnum, Map<ITableParam, ITableProduit>> mapperReferentielProduitTypeSante(
                    DossierProduit dossier) {
        Map<ReferentielEnum, Map<ITableParam, ITableProduit>> map =
                        new HashMap<ReferentielEnum, Map<ITableParam, ITableProduit>>();

        if (dossier != null && CollectionUtils.isNotEmpty(dossier.getDTOProduit())) {

            Converter<List<DTOProduit>, Couple<ReferentielEnum, Map<ITableParam, ITableProduit>>> listProduits2MapTableProduitSanteConverter =
                            new ListProduits2MapTableProduitSanteConverter(libelleProduitTypeSante);

            Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> couple =
                            listProduits2MapTableProduitSanteConverter.convert(dossier.getDTOProduit());
            if (couple != null) {
                map.put(couple.getOne(), couple.getTwo());
            }
        }

        return map;
    }

}
